﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daBase.Objects
{
    /// <summary>
    /// Расширенный список
    /// </summary>
    /// <typeparam name="T">тип списка</typeparam>
    public class List<T> : System.Collections.Generic.List<T>
    {
        /// <summary>
        /// Добавление элемента в список, если он не null
        /// </summary>
        /// <param name="item">элемент</param>
        public void AddNotNull(T item)
        {
            if (item != null)
                Add(item);
        }

        /// <summary>
        /// Добавление набора элементов в список, если он не null
        /// </summary>
        /// <param name="collection">набор элементов</param>
        public void AddRangeNotNull(List<T> collection)
        {
            if (collection != null)
                AddRange(collection);
        }

        /// <summary>
        /// Преобразование списка в строку
        /// </summary>
        /// <param name="Splitter">разделитель между элементами</param>
        /// <returns>строковое представление списка</returns>
        public string Join(string Splitter)
        {
            string result = string.Empty;
            if(Count>0)
            {
                int c = Count - 1;
                for (int i = 0; i < c; i++)
                    result += string.Format("{0}{1}", this[i], Splitter);
                result += this[c].ToString();
            }
            return result;
        }

        /// <summary>
        /// Преобразование списка в строку
        /// </summary>
        /// <returns>строковое представление списка</returns>
        public string Join()
        {
            return Join(string.Empty);
        }

        /// <summary>
        /// Объединение двух списков в один
        /// </summary>
        /// <param name="Items1">первый список</param>
        /// <param name="Items2">второй список</param>
        /// <returns>объединенный список</returns>
        public static List<T> Combine(List<T> Items1, List<T> Items2)
        {
            if ((Items1 == null) && (Items2 == null))
                return null;
            List<T> result = new List<T>();
            result.AddRangeNotNull(Items1);
            result.AddRangeNotNull(Items2);
            return result;
        }

        /// <summary>
        /// Конвертирование всех элементов списка
        /// </summary>
        /// <typeparam name="TOutput">тип результирующего списка</typeparam>
        /// <param name="converter">функция-конвертер</param>
        /// <returns>результирующий список</returns>
        public List<TOutput> ConvertAll<TOutput>(Converter<T, TOutput> converter)
        {
            List<TOutput> converted = new List<TOutput>();
            foreach (T element in this)
                converted.Add(converter(element));
            return converted;
        }
    }
}
